﻿using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TI_4_Limonade_Fabriek.Logging;
using TI_4_Limonade_Fabriek.Model;

namespace TI_4_Limonade_Fabriek.Database
{
    class BatchDBController : DatabaseController
    {
        #region Variabelen declaraties
        ErrorLogging el;
        #endregion

        //Constructor, initialiseren van objecten.
        public BatchDBController()
        {
            el = new ErrorLogging();
        }

        //Functie voegt batch toe aan database.
        public void CreateBatch(Batch batch)
        {
            try
            {
                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd, met parameters.
                string insertString = @"INSERT INTO Batch (`Naam`, `AantalBekers`, `Mengverhouding`, `Kleur`, `Prioriteit`, `Datum`) VALUES (@naam, @aantal, @verhouding, @kleur, @prioriteit, @datum);";

                //Voor elke variabele een MySqlParameter aanmaken.
                MySqlParameter naamParam = new MySqlParameter("@naam", MySqlDbType.VarChar);
                MySqlParameter aantalParam = new MySqlParameter("@aantal", MySqlDbType.Int32);
                MySqlParameter verhoudingParam = new MySqlParameter("@verhouding", MySqlDbType.Int32);
                MySqlParameter kleurParam = new MySqlParameter("@kleur", MySqlDbType.VarChar);
                MySqlParameter prioriteitParam = new MySqlParameter("@prioriteit", MySqlDbType.Int32);
                MySqlParameter datumParam = new MySqlParameter("@datum", MySqlDbType.DateTime);

                //Waardes toewijzen aan de parameters vanuit het Batch object.
                naamParam.Value = batch.Naam;
                aantalParam.Value = batch.AantalBekers;
                verhoudingParam.Value = batch.Mengverhouding;
                kleurParam.Value = batch.Kleur;
                prioriteitParam.Value = batch.Prioriteit;
                datumParam.Value = batch.Datum;

                //Lijst creëren voor alle parameters en alle parameters toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(naamParam);
                parameterList.Add(aantalParam);
                parameterList.Add(verhoudingParam);
                parameterList.Add(kleurParam);
                parameterList.Add(prioriteitParam);
                parameterList.Add(datumParam);

                //Aanroepen functie voor uitvoeren query.
                ExecuteQueryWithoutResult(insertString, parameterList);

                //Connectie met MySql server verbreken.
                Disconnect();
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
            }
        }

        //Methode om alle batches uit de database op te halen en in een lijst terug te geven.
        public List<Batch> ReadBatchList()
        {
            try
            {
                //Creëren lijst voor alle batches.
                List<Batch> batchList = new List<Batch>();

                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd, met parameters.
                string selectString = "SELECT * FROM Batch ORDER BY Datum,Prioriteit DESC,Kleur;";

                //Query uitvoeren en resultaat in een MySqlDatareader stoppen.
                MySqlDataReader reader = ExecuteQueryWithResult(selectString, null);

                //Loopen door de DataReader om alle gegevens op te halen en in een Batch Object te zetten.
                while (reader.Read())
                {
                    int _BId = reader.GetInt32("Bid");
                    string _Naam = reader.GetString("Naam");
                    int _AantalBekers = reader.GetInt32("AantalBekers");
                    int _Mengverhouding = reader.GetInt32("Mengverhouding");
                    string _Kleur = reader.GetString("Kleur");
                    int _Prioriteit = reader.GetInt32("Prioriteit");
                    string _Datum = reader.GetDateTime("Datum").ToString("dd-MM-yyyy");
                    int _Status = reader.GetInt32("Status");

                    Batch batch = new Batch { BId = _BId, Naam = _Naam, AantalBekers = _AantalBekers, Mengverhouding = _Mengverhouding, Kleur = _Kleur, Prioriteit = _Prioriteit, Datum = _Datum, Status = _Status };

                    //Batch object toevoegen aan de lijst.
                    batchList.Add(batch);
                }

                //De datareader sluiten en de connectie met MySql server verbreken.
                reader.Close();
                Disconnect();

                return batchList;
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
                return null;
            }
        }

        //Methode om een enkele batch uit de database op te halen aan de hand van BId.
        public Batch ReadBatch(int BId)
        {
            try
            {
                Batch batch;

                //De query die uit moet worden gevoerd.
                string selectString = "SELECT * FROM Batch WHERE BId=@bid;";

                //Aanmaken parameter voor de variabele en waarde eraan toewijzen.
                MySqlParameter bidParam = new MySqlParameter("@bid", MySqlDbType.Int32);
                bidParam.Value = BId;

                //Lijst voor parameters maken en de parameter toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(bidParam);

                //Verbinding maken met de MySql server.
                Connect();

                //Query uitvoeren en resultaat in een MySqlDatareader stoppen.
                MySqlDataReader reader = ExecuteQueryWithResult(selectString, parameterList);

                //Checken of er data in de datareader staat, zo ja object van batch vullen met de opgehaalde gegevens.
                if (reader.Read())
                {
                    int _BId = reader.GetInt32("Bid");
                    string _Naam = reader.GetString("Naam");
                    int _AantalBekers = reader.GetInt32("AantalBekers");
                    int _Mengverhouding = reader.GetInt32("Mengverhouding");
                    string _Kleur = reader.GetString("Kleur");
                    int _Prioriteit = reader.GetInt32("Prioriteit");
                    string _Datum = reader.GetDateTime("Datum").ToString("dd-MM-yyyy");
                    int _Status = reader.GetInt32("Status");

                    batch = new Batch { BId = _BId, Naam = _Naam, AantalBekers = _AantalBekers, Mengverhouding = _Mengverhouding, Kleur = _Kleur, Prioriteit = _Prioriteit, Datum = _Datum, Status = _Status };
                    Disconnect();
                    return batch;
                }
                else
                {
                    Disconnect();
                    return null;
                }
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
                return null;
            }

        }

        //Methode om een enkele batch uit de database te verwijderen aan de hand van BId.
        public void DeleteBatch(int BId)
        {
            try
            {
                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd.
                string deleteString = "DELETE FROM Batch WHERE BId=@bid";

                //Aanmaken parameter voor de variabele en waarde eraan toewijzen.
                MySqlParameter bidParam = new MySqlParameter("@bid", MySqlDbType.Int32);
                bidParam.Value = BId;

                //Lijst voor parameters maken en de parameter toevoegen.
                List<MySqlParameter> parameterlist = new List<MySqlParameter>();
                parameterlist.Add(bidParam);

                //Aanroepen functie voor uitvoeren query.
                ExecuteQueryWithoutResult(deleteString, parameterlist);

                //Connectie met MySql server verbreken.
                Disconnect();
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
            }
        }

        //Methode om een enkele batch uit de database te updaten aan de hand van BId.
        public void UpdateBatch(Batch batch)
        {
            try
            {
                //Datum in juiste formaat parsen.
                batch.Datum = DateTime.Parse(batch.Datum).ToString("yyyy-MM-dd");

                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd, met parameters.
                string updateString = "UPDATE `Batch` SET `Naam`=@naam, `AantalBekers`=@aantal, `Mengverhouding`=@verhouding, `Kleur`=@kleur, `Prioriteit`=@prioriteit, `Datum`=@datum, `Status`=@status WHERE `BId`=@BId";

                //Voor elke variabele een MySqlParameter aanmaken.
                MySqlParameter naamParam = new MySqlParameter("@naam", MySqlDbType.VarChar);
                MySqlParameter aantalParam = new MySqlParameter("@aantal", MySqlDbType.Int32);
                MySqlParameter verhoudingParam = new MySqlParameter("@verhouding", MySqlDbType.Int32);
                MySqlParameter kleurParam = new MySqlParameter("@kleur", MySqlDbType.VarChar);
                MySqlParameter prioriteitParam = new MySqlParameter("@prioriteit", MySqlDbType.Int32);
                MySqlParameter datumParam = new MySqlParameter("@datum", MySqlDbType.DateTime);
                MySqlParameter statusParam = new MySqlParameter("@status", MySqlDbType.Int32);
                MySqlParameter bidParam = new MySqlParameter("@BId", MySqlDbType.Int32);

                //Waardes toewijzen aan de parameters vanuit het Batch object.
                naamParam.Value = batch.Naam;
                aantalParam.Value = batch.AantalBekers;
                verhoudingParam.Value = batch.Mengverhouding;
                kleurParam.Value = batch.Kleur;
                prioriteitParam.Value = batch.Prioriteit;
                datumParam.Value = batch.Datum;
                statusParam.Value = batch.Status;
                bidParam.Value = batch.BId;

                //Lijst creëren voor alle parameters en alle parameters toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(naamParam);
                parameterList.Add(aantalParam);
                parameterList.Add(verhoudingParam);
                parameterList.Add(kleurParam);
                parameterList.Add(prioriteitParam);
                parameterList.Add(datumParam);
                parameterList.Add(statusParam);
                parameterList.Add(bidParam);

                //Aanroepen functie voor uitvoeren query.
                ExecuteQueryWithoutResult(updateString, parameterList);

                //Connectie met MySql server verbreken.
                Disconnect();
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
            }
        }

    }
}
